草庐IT

c++ - COM + WaitForSingleObject

全部标签

c++ - 运行 regsvr32.exe 时,带有线程句柄的 WaitForSingleObject 卡住

我有线程A正在创建另一个线程B,线程A正在等待使用WaitForSingleObject等待线程B死亡。问题是,即使线程B从线程的“thread_func”返回,线程A也没有收到信号!。我知道这是因为我在thread_func(线程B的主要函数)的末尾添加了跟踪(OutputDebugString),我可以看到线程B完成了它的执行,但线程A永远不会从WaitForSingleObject中出来。现在,我还必须补充一点,这段代码在一个COM对象中,并且当我调用regsvr32.exe时会发生上述情况(它卡住了!),所以我相信线程A来自DLLMain.知道为什么线程A没有收到信号吗?!?!

c++ - 在 "if"语句中创建 COM 智能指针时出现错误 C2275

为什么我不能if(IUnknownPtrp=anotherComPtr){}//errorC2275:'IUnknownPtr':illegaluseofthistypeasanexpression虽然我可以if(int*a=anotherPointer){}IUnknownPtr是通过_COM_SMARTPTR_TYPEDEF(IUnknown,__uuidof(IUnknown))定义的(就像我使用的任何其他智能指针一样)如何在if语句中创建一个comsmartptr并验证它是否有效?谢谢。我使用VS2008附注这与编码方式是否好无关,而是关于errorC2275。

c++ - 为什么此 C++ 代码会在 ideone.com 上出现 SIGILL?

为什么会这样?该代码适用于Linux上的GCC4.7和Windows上的MSVC++2010,并且不会生成警告。然而,在ideone.com上它crashes使用SIGILL。这里是否涉及未定义的行为?#include#includeusingnamespacestd;enumtypes{INT,DOUBLE,CHAR,STRING};structmt{typestype;union{inti;doubled;charc;constchar*s;}val;mt(inti):type(INT){val.i=i;}mt(doubled):type(DOUBLE){val.d=d;}mt(c

c++ - COM 对象函数上的 API Hook ?

问候StackOverflowians,如发现here,Windows7有一个错误,其中DISPID_BEFORENAVIGATE2事件不会为Windows资源管理器实例触发。这个事件允许shell扩展在导航即将发生时得到通知,并且(对我来说最重要的是)有机会取消导航。我一直在寻找解决方法很长一段时间,我想我找到了一个。但是,我想就它的安全性征求一些意见。我最近一直在玩APIHook,我已经在用它来Hook我的扩展的一些功能。我注意到有一个functioninIShellBrowser控制导航。起初我以为你不能Hook那样的东西,但在阅读了layoutofaCOMobject之后我意识

c# - 在 C++ 中注册 .NET COM 事件的处理程序

我一直在学习如何通过COM(http://msdn.microsoft.com/en-us/library/zsfww439.aspx和http://msdn.microsoft.com/en-us/library/bd9cdfyx.aspx)公开.NET框架的“教程”。除了事件部分,一切正常。当我向C#接口(interface)添加事件时,会生成以下C++代码:struct__declspec(uuid("..."))_MessageEventHandler:IDispatch{};struct__declspec(uuid("..."))IConnection:IDispatch{

c++ - 进程外 COM 对象能否确定其父进程?

我可以从进程外COM对象(LocalServer32)确定请求创建该对象的客户端进程吗?-具体来说,我需要掌握客户端进程命令行。这个问题的出现是因为(由于标准化、实现和支持不佳)对象的潜在第3方客户端具有对象需要解决的各种特性。为此,对象需要能够识别其当前客户端。不幸的是,扩展COM对象的接口(interface)以便客户端可以识别自己是不可能的……或者更准确地说,可以扩展接口(interface),但我无法让客户端调用扩展。 最佳答案 进一步调查后,我怀疑答案是否定的,但请务必告诉我我错了。使用ProcessExplorer我可以

c++ - 在 64 位环境中加载 native COM DLL

我有一个用C++编写的32位/64位COMDLL:mycom32.dll、mycom64.dll。它们都完全相同,但mycom32.dll是为32位编译的,而mycom64.dll是为64位编译的。这意味着这两个DLL具有相同的UUID和相同的CLSID!现在,有时我想在32位进程中使用这个COM,有时我想在64位进程中使用这个COM。是否可以在不创建两个不同的CLSID的情况下加载正确的DLL,并在运行时检查进程是否为32位/64位? 最佳答案 应该可以毫无问题地注册它们;这是RegistryRedirection的一部分应该解决

c++ - 如何定义 COM coclass 的实现?

我是COM的新手,我在互联网上四处寻找如何用C++创建COM类(供C#使用)。我已经在.idl文件中看到,我必须放置如下内容:[object,uuid(a93164ee-e6d4-44be-aa27-f00ce6972719),helpstring("interfaceITopologyQuery")]interfaceITopologyQuery:IUnknown{HRESULTLoadFile(BSTRcompleteFileName);HRESULTSetParameters(intabove,intpercentage);}[uuid(a958f2af-8b55-43c4-9f

c++ - 每个新的 COM 类都必须重新实现 IUnknown 接口(interface)吗?

抱歉,如果这个问题对每个人来说都是显而易见的,但我对COM还很陌生。从我在这里看到的教程http://www.codeguru.com/cpp/com-tech/activex/tutorials/article.php/c5567,似乎每个用C++创建的COM类都必须实现自己的QueryInterface、AddRef和Release。由于这些方法对于任何新类都应该具有基本相同的实现,所以我不明白为什么没有一些抽象类或为开发人员实现它的任何东西。我不明白为什么我要重新实现这么多人已经一次又一次实现的相同东西(除非教程有误并且确实有问题)。谢谢 最佳答案

c++ - 触发 COM 事件时调用 Lock()/Unlock() 的目的是什么?

ATLCOM服务器中触发事件的一段典型代码如下(从thisquestion复制并略微删减):HRESULTFire_MessageTrigger(){HRESULThr=S_OK;T*pThis=static_cast(this);intcount=m_vec.GetSize();for(inti=0;iLock();//I'maskingaboutthis...CComPtrpunkConnection=m_vec.GetAt(i);pThis->Unlock();//andthisIDispatch*pConnection=static_cast(punkConnection.p)